package wei.qiang.ye.serverconsumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import wei.qiang.ye.serverconsumer.domain.User;
import wei.qiang.ye.serverconsumer.service.UserService;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 可以看到使用服务名称（Server-Provider）去获取服务的，而不是使用传统的IP加端口的形式。
     * 这就体现了使用Eureka去获取服务的好处，
     * 我们只要保证这个服务名称不变即可，IP和端口不再是我们关心的点
     * @return
     */
    @GetMapping("/info")
    public String getInfo() {
        return this.restTemplate.getForEntity("http://Server-Provider/info", String.class).getBody();
    }


    @Autowired
    private UserService userService;

    @GetMapping("user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }

    /**
     * 测试Hystrix缓存
     */
    @GetMapping("testCache")
    public void testCache(){
        userService.getUser(1L);
        userService.getUser(1L);
        userService.getUser(1L);
    }


    /**
     * 测试Hystrix请求合并
     * @throws InterruptedException
     * @throws ExecutionException
     */
    @GetMapping("testRequestMerge")
    public void testRequerstMerge() throws InterruptedException, ExecutionException {
        Future<User> f1 = userService.findUser(1L);
        Future<User> f2 = userService.findUser(2L);
        Future<User> f3 = userService.findUser(3L);
        f1.get();
        f2.get();
        f3.get();
        Thread.sleep(200);
        Future<User> f4 = userService.findUser(4L);
        f4.get();
    }

}
